package savet.util;

import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import savet.entidades.Empregador;
import savet.entidades.Lote;
import savet.entidades.Trabalhador;
import savet.gui.tabelas.GuiEdicaoLote;
import savet.util.io.ArquivoUtil;

/**
 *
 * @author Adisson Marinho
 */
public class LoteUtil implements java.io.Serializable {

    private static LoteUtil instance = null;
    private Lote loteAtual = null;
    private Empregador empregadorAtual;

    /** Contador de auditoria para limitar a quantidade de auditorias simultaneas */
    private int contadorAuditoria = 0;

    /** indica se o lote que foi setado e proveniente de arquivo. */
    private boolean arquivo;

    private File arquivoLote;
    
    private LoteUtil() {
        SauditaLog.adicionarInfoLog("Iniciando utilitario para lote...");
    }

    public synchronized static LoteUtil getInstance() {
        if (instance == null) {
            instance = new LoteUtil();
        }
        return instance;
    }

    public void adicionarEmpregador(Empregador empregador) {
        if (!loteAtual.getEmpregadores().contains(empregador)) {
            loteAtual.getEmpregadores().add(empregador);
        }
    }

    public void removerEmpregador(Empregador empregador) {
        loteAtual.getEmpregadores().remove(empregador);
    }

    public Lote getLoteAtual() {
        return loteAtual;
    }

    public void setLoteAtual(Lote loteAtual) {
        this.loteAtual = loteAtual;
    }

    public void setEmpregadorAtual(Empregador empregador) {
        this.empregadorAtual = empregador;
    }

    public Empregador getEmpregadorAtual() {
        return empregadorAtual;
    }

    public int getContadorAuditoria() {
        return contadorAuditoria;
    }

    public boolean hasArquivo() {
        return arquivo;
    }

    public File getArquivoLote() {
        return arquivoLote;
    }

    public void setArquivoLote(File arquivoLote) {
        this.arquivoLote = arquivoLote;
        this.arquivo = arquivoLote != null;
    }

    public void salvarArquivoLote() {
        try {
            if (hasArquivo()) {
                ArquivoUtil.salvar(getArquivoLote(), loteAtual);
            } else {
                ArquivoUtil.salvarComFileChooser(loteAtual);
            }
        } catch (IOException ex) {
            Logger.getLogger(GuiEdicaoLote.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void incrementarContadorAuditoria() {
        contadorAuditoria += 1;
    }

    /**
     * Reseta o contador de auditorias. <br/>
     */
    public void resetarContadorAuditoria() {
        contadorAuditoria = 0;
    }

    /**
     * Reseta o contador de auditorias; <br/>
     * Anula o empregador atual; <br/>
     * Anula o arquivo do lote; <br/>
     * Limpa a lista de trabalhadores em {@link ListaTrabalhadores}.
     */
    public void resetarLote() {
        resetarContadorAuditoria();
        setLoteAtual(null);
        setEmpregadorAtual(null);
        setArquivoLote(null);
        ListaTrabalhadores.getInstance().setTrabalhadores(new LinkedList<Trabalhador>());
    }

}
